package com.ming.exception;

import com.ming.enums.ErrorCode;
import lombok.EqualsAndHashCode;

/**
 * 系统异常
 * 用于处理系统级别的异常情况
 *
 * @author ming
 * @version 1.0
 */
@EqualsAndHashCode(callSuper = true)
public class SystemException extends BaseException {

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     */
    public SystemException(ErrorCode errorCode) {
        super(errorCode);
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param message   自定义错误信息
     */
    public SystemException(ErrorCode errorCode, String message) {
        super(errorCode, message);
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param cause     原因
     */
    public SystemException(ErrorCode errorCode, Throwable cause) {
        super(errorCode, cause);
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param message   自定义错误信息
     * @param cause     原因
     */
    public SystemException(ErrorCode errorCode, String message, Throwable cause) {
        super(errorCode, message, cause);
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param message   自定义错误信息
     * @param data      错误数据
     */
    public SystemException(ErrorCode errorCode, String message, Object data) {
        super(errorCode, message, data);
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param message   自定义错误信息
     * @param data      错误数据
     * @param cause     原因
     */
    public SystemException(ErrorCode errorCode, String message, Object data, Throwable cause) {
        super(errorCode, message, data, cause);
    }

    // ========== 常用静态工厂方法 ==========

    /**
     * 数据库异常
     */
    public static SystemException database(String message) {
        return new SystemException(ErrorCode.DATABASE_ERROR, message);
    }

    /**
     * 数据库异常（带原因）
     */
    public static SystemException database(String message, Throwable cause) {
        return new SystemException(ErrorCode.DATABASE_ERROR, message, cause);
    }

    /**
     * 数据库连接异常
     */
    public static SystemException databaseConnection(String message, Throwable cause) {
        return new SystemException(ErrorCode.DATABASE_CONNECTION_ERROR, message, cause);
    }

    /**
     * 第三方服务异常
     */
    public static SystemException thirdParty(String message) {
        return new SystemException(ErrorCode.THIRD_PARTY_SERVICE_ERROR, message);
    }

    /**
     * 第三方服务异常（带原因）
     */
    public static SystemException thirdParty(String message, Throwable cause) {
        return new SystemException(ErrorCode.THIRD_PARTY_SERVICE_ERROR, message, cause);
    }

    /**
     * 配置异常
     */
    public static SystemException config(String message) {
        return new SystemException(ErrorCode.CONFIG_ERROR, message);
    }

    /**
     * 配置缺失异常
     */
    public static SystemException configMissing(String message) {
        return new SystemException(ErrorCode.CONFIG_MISSING, message);
    }

    /**
     * 内部服务器错误
     */
    public static SystemException internal(String message) {
        return new SystemException(ErrorCode.INTERNAL_SERVER_ERROR, message);
    }

    /**
     * 内部服务器错误（带原因）
     */
    public static SystemException internal(String message, Throwable cause) {
        return new SystemException(ErrorCode.INTERNAL_SERVER_ERROR, message, cause);
    }
}